<!doctype html>
<html>

	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

		<title>葡萄藤PPT</title>

		<link rel="stylesheet" href="../css/reveal/reveal.css">

		<!-- PPT主题，可以在/css/reveal/theme/中选择其他主题，目前暂时只能使用该模板 -->
		<link rel="stylesheet" href="../css/reveal/theme/ptt.css">

		<!-- syntax highlighting 代码高亮主题 -->
		<link rel="stylesheet" href="../lib/reveal/css/zenburn.css">

		<!-- 打印和PDF输出样式 -->
		<script>
			var link = document.createElement('link');
			link.rel = 'stylesheet';
			link.type = 'text/css';
			link.href = window.location.search.match(/print-pdf/gi) ? '../css/reveal/print/pdf.css' : '../css/reveal/print/paper.css';
			document.getElementsByTagName('head')[0].appendChild(link);
		</script>
		<style>
			* {
				font-family: 'Microsoft JhengHei'!important;
			}
			
			.reveal pre code {
				background-color: #120;
			}
			
			h5,
			h6 {
				text-transform: none !important;
			}
			
			h6 {
				text-align: start;
				font-size: 22px !important;
			}
			
			xmp {
				margin: 0;
			}
		</style>
	</head>

	<body>
		<img src="../img/demo/logo.png" alt="" usemap="#pttmap" class="base-logo">
		<map name="pttmap">
    <area shape="rect" coords="0,0,276,58" href="http://www.jnshu.com" alt="" target="_blank"/>
</map>
		<div class="reveal">
			<div class="slides">
				<section>
					<h4>小课堂【萌新】</h4>
					<h4> 函数表达式和函数声明有什么区别</h4>
					<h4>分享人：王寒</h4>
				</section>
				<section>
					<p>目录</p>
					<p>1.背景介绍</p>
					<p>2.知识剖析</p>
					<p>3.常见问题</p>
					<p>4.解决方案</p>
					<p>5.编码实战</p>
					<p>6.扩展思考</p>
					<p>7.参考文献</p>
					<p>8.更多讨论</p>
				</section>
				<section>
					<section>
						<h3>1.背景介绍</h3>
					</section>
				</section>
				<section>
					<section>
						<h5>函数就是一段可以反复调用的代码块。函数声明由三部分组成：函数名，函数参数，函数体。
							整体的构造是function命令后面是函数名，函数名后面是一对圆括号，里面是传入函数的参数。
							函数体放在大括号里面。当函数体没有使用return关键字返回函数时，函数调用时返回默认的undefined；
							如果有使用return语句，则返回指定内容。函数最后不用加上冒号。
						</h5>
						<pre>
						   <code>
							function keith() {}
                             console.log(keith())   // 'undefined'

                             function rascal(){
                             return 'rascal';
                            }
                            console.log(rascal())    // 'rascal'
						   </code>
					    </pre>
					</section>
				</section>
				<section>
					<section>
						<h3>2.知识剖析</h3>
					</section>
				</section>
				<section>
					<section>
						<h5>
							什么是FUNCTION DECLARATION（函数声明）？
                        Function Declaration 可以定义命名的函数变量，而无需给变量赋值。Function Declaration 是一种独立的结构，不能嵌套在非功能模块中。
                                                                  就是使用function关键字声明一个函数，再指定一个函数名，叫函数声明
						</h5>
					</section>
					<section>
						<h5> 函数声明是在预执行期执行的，也就是说函数声明是在浏览器准备解析并执行脚本代码的时候执行的。所以，当去调用一个函数声明时，可以在其前面调用并且不会报错。</h5>
						<pre>
						<code>
							 console.log(rascal())   // 'rascal'
                            function rascal(){
         					 return 'rascal';
     						}
						</code>
					</pre>
					</section>
				</section>
				<section>
					<section>
						<h5>
							什么是FUNCTION EXPRESSION（函数表达式）？
                        Function Expression 将函数定义为表达式语句（通常是变量赋值）的一部分。通过 Function Expression 定义的函数可以是命名的，也可以是匿名的。Function Expression 不能以“function”开头。
                                                                  使用function关键字声明一个函数，但未给函数命名，最后将匿名函数赋予一个变量，叫函数表达式
                        </h5>
					</section>
					<section>
						<h5> 简单点来说函数表达式是把一个匿名函数赋给一个全局变量。这个匿名函数又称为函数表达式，因为赋值语句的等号右侧只能放表达式。函数表达式末尾需要加上分号，表示语句结束。</h5>
						<pre>
						<code>
							var keith = function() {
        							 //函数体
    						 };
						</code>
					</pre>
					</section>
				</section>
				<section>
					<h5>   函数表达式存储在变量后，变量也可作为一个函数使用：</h5>
					<pre>
						<code>
							var x = function (a, b) {return a * b};
                            alert= x(4, 3);
						</code>
					</pre>
					<h5>以上函数实际上是一个 匿名函数 (函数没有名称)。 函数存储在变量中，不需要函数名称，通常通过变量名来调用。</h5>
					<pre>
						<code>
							var x = function (a, b) {return a * b};
                        var z = x(4, 3);
                        alert= z;
						</code>
					</pre>

					<h6>
						
                    </h6>
				</section>
				<section>
					<h5>3.常见问题</h5>
					<h6>一、什么是JavaScript函数？</h6>
					<h6>二、两者具体有哪些区别呢？</h6>
				</section>
				<section>
					<h5>4.解决方案</h5>

				</section>
				<section>

					<h6>1.JavaScript函数<br />
					函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块<br />
					函数语法：函数就是包裹在花括号中的代码块，使用了关键词function：
					</h6>
					<pre>
						<code>
							function functionname(){
							执行代码
							}
						</code>
					</pre>

				</section>
				<section>
					<h6>当调用该函数时，会执行函数内的代码。<br />
					可以在某事件发生时直接调用函数<br />
					调用带参数的函数,在调用函数时，可以向其传递值，这些值被称为参数。这些参数可以在函数中使用。
					可以发送任意多的参数，由逗号(,)分隔：
					</h6>
					<pre>
						<code>
							myFunction(argument1,argument2)
						</code>
					</pre>

				</section>
				</section>
				<section>
					<section>
						<h6>当声明函数时，把参数作为变量来声明：</h6>
						<pre>
						<code>
							function myFunction(var1,var2){
								代码
							}
						</code>
					</pre>
						<h6>点击这个按钮，来调用带参数的函数</h6>
						<pre>
						<code>
							functionmyFunction(name,job){
								alert("Welcome "+ name +", the "+ job);
							}
						</code>
					</pre>
					</section>
				</section>
				<section>
					<section>
						<h5>2.函数声明和函数表达式的区别</h5>
					</section>
					<section>
						<h5>1.函数声明中函数名是必须的；函数表达式中则是可选的</h5>
						<pre>
						<code>
						//函数声明
						function sum(a, b) {
							return a + b;
						}
						alert(sum(1, 2));
						//函数表达式
						var s = function sum(a, b) {
						return a + b;
						}
						alert(s(1, 2));
						var s = function(a, b) {
						return a + b;
						}
						alert(s(1, 2));//以上两种都可以
						</code>
					</pre>
					</section>
					<section>
						<h5>2.用函数声明定义的函数,函数可以在函数声明之前调用,而用函数表达式定义的函数只能在声明之后调用。</h5>
						<pre>
						<code>
							//函数声明
							alert(sum(1, 2));//3
							function sum(a, b) {
							return a + b;
							}
							//函数表达式：发生错误
							try {
							alert(s(1, 2));
							var s = function sum(a, b) {
							return a + b;
							}
							}
							catch (e) {
							alert("wrong!");
							}
						</code>
					</pre>
					</section>
					<section>
						<h5>3.以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,
							但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明.
						</h5>
						<pre>
						<code>
							//函数声明式
							function greeting(){
   							console.log("hello world"); 
							}
 
							//函数表达式
							var greeting = function(){
  							console.log("hello world"); 
							}
						</code>
					</pre>
					</section>
				</section>
				<section>
					<section>
						<h3>5.扩展思考</h3>
						<h5>使用function关键字声明一个函数，再指定一个函数名，叫函数声明。</h5>
						<pre>
						<code>
							function fn(){……}
						</code>
					</pre>
					</section>
					<section>
						<h5>使用function关键字声明一个函数，但未给函数命名，最后将匿名函数赋予一个变量，叫函数表达式。</h5>
						<pre>
						<code>
							var fn=function(){……}
						</code>
					</pre>
					</section>
					<section>
						<h5>使用function关键字声明一个函数，但未给函数命名,这个又称之为什么呢？是属于以上两种类型的哪一种？</h5>
						<pre>
						<code>
							function(){……}
						</code>
					</pre>

					</section>
				</section>

				<section>
					<section>
						<h3>6.参考文献</h3>
						<h5><!--参考一：-->函数声明与函数表达式以及立即执行函数的讨论</h5>
						<!--<h5>参考二：雨落川下雪</h5>-->
					</section>
				</section>-->
				<section>
					<section>
						<h3>7.更多讨论</h3>
					</section>
					<section>
						<h5>问题一：关于立即执行函数的讨论</h5>
					</section>
					<section>
						<h5>回答：也就是说只有函数表达式才能实现立即执行，匿名函数也是函数表达式为何不能立即执行呢?<br />
							因为匿名函数开始的function会被JavaScript引擎识别为函数声明的开始，所以加上括号也不会被执行</h5>
						<h5>	而加上()，！，+，-等符号为什么就可以了呢?<br />
							因为加上这些符号就可以告诉js引擎这不是函数声明了。
                        </h5>
					</section>
					<section>
						<h5>问题二：给匿名函数用小括号包起来，为什么能执行？</h5>
					</section>
					<section>
						<pre>
						<code>
							//匿名函数：
							function(){  　//如果不加小括号则会报错！
							alert('弹出框');
							}();
							//添加小括号后的匿名函数
							(function(){
							alert('弹出框');
							})();
						</code>
					</pre>
						<h5>回答：小括号能把我们的表达式组合分块，并且每一块，也就是每一对小括号，
							都有一个返回值。这个返回值实际上也就是小括号中表达式的返回值。
							加上括号也不会被执行
						</h5>
					</section>
					<section>
						<h5>问题三：什么是自执行函数？</h5>
					</section>
					<section>
						<h5>	
							回答：在JavaScript里，任何function在执行的时候都会创建一个执行上下文，
							因为function声明的变量和function有可能只在该function内部，这个上下文，
							在调用function的时候，提供了一种简单的方式来创建自由变量或私有子function。
                        </h5>
					</section>
					<section>
						<h5>函数表达式的作用域<br />
						如果函数表达式声明的函数有函数名,那么这个函数名就相当于这个函数的一个局部变量,只能在函数内部调用
						</h5>
						<pre>
						<code>
						var f = function fact(x) { 
        						if (x <= 1) 
          					      return 1;
        						else
          					      return x*fact(x-1);
        					    };
        					      alert(fact());  // Uncaught ReferenceError: fact is not defined

						</code>
					</pre>
					<h5>fact()在函数内部可以调用,在函数外部调用就会报错:fact未定义</h5>
					</section>
				</section>
				<section>
					<h4></h4>
					<p>感谢大家观看</p>
					<p>
						By
						<small style="vertical-align: middle">王寒</small>
					</p>
				</section>
			</div>
		</div>
		<script src="../lib/reveal/js/head.min.js"></script>
		<script src="../lib/reveal/reveal.js"></script>
		<script>
			// 以下为常见配置属性的默认值
			// {
			// 	controls: true, // 是否在右下角展示控制条
			// 	progress: true, // 是否显示演示的进度条
			// 	slideNumber: false, // 是否显示当前幻灯片的页数编号，也可以使用代码slideNumber: 'c / t' ，表示当前页/总页数。
			// 	history: false, // 是否将每个幻灯片改变加入到浏览器的历史记录中去
			// 	keyboard: true, // 是否启用键盘快捷键来导航
			// 	overview: true, // 是否启用幻灯片的概览模式，可使用"Esc"或"o"键来切换概览模式
			// 	center: true, // 是否将幻灯片垂直居中
			// 	touch: true, // 是否在触屏设备上启用触摸滑动切换
			// 	loop: false, // 是否循环演示
			// 	rtl: false, // 是否将演示的方向变成RTL，即从右往左
			// 	fragments: true, // 全局开启和关闭碎片。
			// 	autoSlide: 0, // 两个幻灯片之间自动切换的时间间隔（毫秒），当设置成 0 的时候则禁止自动切换，该值可以被幻灯片上的 ` data-autoslide` 属性覆盖
			// 	transition: 'default', // 切换过渡效果，有none/fade/slide/convex/concave/zoom
			// 	transitionSpeed: 'default', // 过渡速度，default/fast/slow
			// 	mouseWheel: true, //是否启用通过鼠标滚轮来切换幻灯片
			// }
			// 初始化幻灯片
			Reveal.initialize({
				//        history: false,
				history: true,
				dependencies: [
					{ src: '../plugin/markdown/marked.js' },
					{ src: '../plugin/markdown/markdown.js' },
					{ src: '../plugin/notes/notes.js', async: true },
					{
						src: '../plugin/highlight/highlight.js',
						async: true,
						callback: function() {
							hljs.initHighlightingOnLoad();
						}
					}
				]
			});
		</script>
	</body>

</html>
